﻿using Max.PH4_2104A.Shopping.Domain;
using Max.PH4_2104A.Shopping.DTO;
using Max.PH4_2104A.Shopping.IRepository;
using Max.PH4_2104A.Shopping.IService;

namespace Max.PH4_2104A.Shopping.Service
{
    /// <summary>
    /// 系统用户的服务实现
    /// </summary>
    public class SystemUserService : ISystemUserService
    {
        ISystemUserRepository _repository;
        IUnitOfWork _unitOfWork;

        public SystemUserService(ISystemUserRepository repository, IUnitOfWork unitOfWork)
        {
            _repository = repository;
            _unitOfWork = unitOfWork;
        }

        //删除
        public int Delete(SystemUserModel model)
        {
            _repository.Delete(model);
            return _unitOfWork.SaveChanges();
        }

        public IQueryable<SystemUserModel> GetAll()
        {
            throw new NotImplementedException();
        }

        public IQueryable<SystemUserModel> GetAll(int pageIndex, int pageSize, out int total)
        {
            throw new NotImplementedException();
        }

        public IQueryable<SystemUserModel> GetAll(string? name, int pageIndex, int pageSize, out int total)
        {
            throw new NotImplementedException();
        }

        public SystemUserModel GetFirstById(object id)
        {
            throw new NotImplementedException();
        }

        //添加
        public int Insert(SystemUserModel model)
        {
            int result = 0;

            //事务：执行二条及以上的非查询sql，要么全成功，要么全失败。成功则提交事务，失败则回滚事务
            //事务的三个步骤：开启、提交、回滚

            //开启事务：用上下文对象的database属性
            using (var tran = _unitOfWork.GetContext().Database.BeginTransaction()) //1、开启事务
            {
                try
                {
                    _repository.Insert(model);
                    result = _unitOfWork.SaveChanges();

                    tran.Commit();//2、提交事务
                }
                catch (Exception)
                {
                    tran.Rollback();//3、回滚事务
                    throw;
                }
            }

            return result;
        }

        public int Update(SystemUserModel model)
        {
            throw new NotImplementedException();
        }

        /*
         * 1、登录状态：成功和失败
         * 2、失败会有很多原因：账号不存在，密码不正确，账号已禁用，账号已黑名单......
         * 3、成功了，要把登录的用户信息返回给前端
         * **/
        //返回值：可以用dynamic，也可以创建一个类

        //Tuple:元祖
        //<>尖括号中，最多可以放8个参数
        //参数也可以是元祖
        public Tuple<ResponseStateCode, SystemUserOutputDto> Login(string userName, string password)
        {
            //根据用户名去数据库查找（本着数据表中用户名不能重复的原则），所以查出来的结果最多只有一条，最少没有。所以有FirstOrDefault
            var data = _repository.GetAll().Where(x => x.LoginName.Equals(userName)).FirstOrDefault();

            if (data == null) //数据为null,表示用户不存在，数据库中没有这条记录
            {
                return Tuple.Create<ResponseStateCode, SystemUserOutputDto>(ResponseStateCode.Err_User_NoExist, null);
            }

            if (!data.Password.Equals(password))  //数据库中的密码和输入的密码不匹配
            {
                return Tuple.Create<ResponseStateCode, SystemUserOutputDto>(ResponseStateCode.Err_Password, null);
            }

            /*
             * 返回的数据是DTO，而从数据库获取的是Model
             * 所以需要将model和dto进行转换。有两种方式：
             * 1、手动转
             * 2、自动转（Automapper）
             * 
             * **/
            //手动赋值转换
            SystemUserOutputDto dto = new SystemUserOutputDto
            {
                CreatedBy = data.CreatedBy,
                CreatedDate = data.CreatedDate,
                Id = data.Id,
                LoginName = data.LoginName,
            };
            return Tuple.Create(ResponseStateCode.Success, dto);
        }

        //多返回值
        //public (bool,string,SystemUserModel) Login(string userName,string password)
        //{
        //    return (true, "登录成功", new SystemUserModel());
        //}
    }
}